package com.example.link;

import java.util.HashSet;
import java.util.Set;

/**
 * 环形链表
 * 给定一个链表，判断链表中是否有环。
 * 如果链表中有某个节点，可以通过连续跟踪next指针再次到达该节点，则链表中存在环
 * 如果链表中存在环返回true，否则返回false。
 */
public class LinkCycle {

    private static class LinkNode {

        int val;
        LinkNode next;

        public LinkNode(int val, LinkNode next) {
            this.val = val;
            this.next = next;
        }

    }

    private static boolean hasCycle(LinkNode head) {
        // 利用hashSet去重机制，如果第二次走到某个节点会添加失败
        Set<LinkNode> set = new HashSet<>();
        while (head != null) {
            if (!set.add(head)) {
                return true;// 添加失败，存在闭环
            }
            head = head.next;
        }
        return false;
    }

    public static void main(String[] args) {


        LinkNode node5 = new LinkNode(5, null);
        LinkNode node4 = new LinkNode(4, node5);
        LinkNode node3 = new LinkNode(3, node4);
        LinkNode node2 = new LinkNode(2, node3);
        LinkNode node1 = new LinkNode(1, node2);

        node5.next = node1;// 闭环

        System.out.println(hasCycle(node1));

    }

}
